]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
workspaceThumbnails: Update indicator on workspace changes
authorFlorian Müllner <fmuellner@gnome.org>
Tue, 2 Mar 2021 18:48:55 +0000 (19:48 +0100)
committerMarge Bot <marge-bot@gnome.org>
Wed, 3 Mar 2021 18:04:13 +0000 (18:04 +0000)
We block state updates while the indicator for the active workspace
is animating. To track that, we check whether the scroll-adjustment's
value matches the active workspace index. That works as long as the
adjustment's value changes after the active workspace, but not when
switching workspaces via SwipeTracker which only changes the active
workspace after transitioning to the new scroll value.

To fix that, update the indicator on workspace changes as well.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1716>

js/ui/workspaceThumbnail.js

index 17d29d0d1a8a7c0ea7237bba91c2c54537b33257..79c8df22490225df55a681ee0d1c5f03df7a2d41 100644 (file)
@@ -706,24 +706,13 @@ var ThumbnailsBox = GObject.registerClass({
         });
         this.connect('destroy', () => this._onDestroy());
 
-        this._switchWorkspaceNotifyId = 0;
         this._nWorkspacesNotifyId = 0;
+        this._activeWorkspaceChangedId = 0;
         this._syncStackingId = 0;
 
         this._scrollAdjustment = scrollAdjustment;
-
         this._scrollValueId = this._scrollAdjustment.connect('notify::value',
-            adj => {
-                const { workspaceManager } = global;
-                const activeIndex = workspaceManager.get_active_workspace_index();
-
-                this._animatingIndicator = adj.value !== activeIndex;
-
-                if (!this._animatingIndicator)
-                    this._queueUpdateStates();
-
-                this.queue_relayout();
-            });
+            () => this._updateIndicator());
     }
 
     _onDestroy() {
@@ -762,6 +751,19 @@ var ThumbnailsBox = GObject.registerClass({
         this.notify('should-show');
     }
 
+    _updateIndicator() {
+        const { value } = this._scrollAdjustment;
+        const { workspaceManager } = global;
+        const activeIndex = workspaceManager.get_active_workspace_index();
+
+        this._animatingIndicator = value !== activeIndex;
+
+        if (!this._animatingIndicator)
+            this._queueUpdateStates();
+
+        this.queue_relayout();
+    }
+
     _activateThumbnailAtPoint(stageX, stageY, time) {
         const [r_, x] = this.transform_stage_point(stageX, stageY);
 
@@ -992,6 +994,9 @@ var ThumbnailsBox = GObject.registerClass({
         this._nWorkspacesNotifyId =
             workspaceManager.connect('notify::n-workspaces',
                                      this._workspacesChanged.bind(this));
+        this._activeWorkspaceChangedId =
+            workspaceManager.connect('active-workspace-changed',
+                () => this._updateIndicator());
         this._workspacesReorderedId =
             workspaceManager.connect('workspaces-reordered', () => {
                 this._thumbnails.sort((a, b) => {
@@ -1019,13 +1024,17 @@ var ThumbnailsBox = GObject.registerClass({
         if (this._thumbnails.length == 0)
             return;
 
+        const { workspaceManager } = global;
+
         if (this._nWorkspacesNotifyId > 0) {
-            let workspaceManager = global.workspace_manager;
             workspaceManager.disconnect(this._nWorkspacesNotifyId);
             this._nWorkspacesNotifyId = 0;
         }
+        if (this._activeWorkspaceChangedId > 0) {
+            workspaceManager.disconnect(this._activeWorkspaceChangedId);
+            this._activeWorkspaceChangedId = 0;
+        }
         if (this._workspacesReorderedId > 0) {
-            let workspaceManager = global.workspace_manager;
             workspaceManager.disconnect(this._workspacesReorderedId);
             this._workspacesReorderedId = 0;
         }